package com.mrogrape.notepad.data;

import java.io.File;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;

import com.mrogrape.notepad.common.ExitActionHandler;
import com.mrogrape.notepad.common.NotepadUtils;
import com.mrogrape.notepad.ui.editor.ContentType;
import com.mrogrape.util.StringUtils;

public class ApplicationContext {

	/**
	 * 获取系统默认文本编码。
	 * 
	 * @return
	 */
	public static String getSystemDefaultTextCharset() {

		if (ApplicationContext.systemDefaultCharset == null) {
			ApplicationContext.systemDefaultCharset = System.getProperty("file.encoding");
		}
		return ApplicationContext.systemDefaultCharset;
	}

	private static String systemDefaultCharset = null;

	/**
	 * 获取标题序列号。
	 * 
	 * @return
	 */
	public static int nextTabTitleSequenceNo() {

		return ApplicationContext.tabTitleSequenceNo++;
	}

	private static int tabTitleSequenceNo = 1;

	/**
	 * 根据文件扩展名获取该文件的内容类型。
	 * 
	 * @param file
	 * @return
	 */
	public static ContentType findContentTypeFromFileExtension(File file) {

		if (StringUtils.isEmpty(NotepadUtils.getFileExtension(file))) {
			return ContentType.PLAIN_TEXT;
		}

		for (ContentType c : ApplicationContext.getSupportedContentType()) {
			if (c.isFileSupportedFor(file)) {
				return c;
			}
		}

		return null;
	}

	/**
	 * 查看某个文件是否被程序支持。
	 * 
	 * @param file
	 * @return
	 */
	public static boolean isFileContentTypeSupported(File file){

		return ApplicationContext.findContentTypeFromFileExtension(file) != null;
	}

	/**
	 * 获取当前程序全部支持的内容类型。
	 * 
	 * @return 当前程序全部支持的内容类型对象数组。
	 */
	public static ContentType[] getSupportedContentType() {

		if (ApplicationContext.supportedContentType == null) {
			ApplicationContext.installSupportedContentType();
		}

		return ApplicationContext.supportedContentType.toArray(new ContentType[0]);
	}

	/**
	 * ; 安装程序支持的内容类型。
	 */
	private static void installSupportedContentType() {

		ApplicationContext.supportedContentType = new ArrayList<ContentType>();

		ApplicationContext.supportedContentType.add(ContentType.HTML);
		ApplicationContext.supportedContentType.add(ContentType.JAVA);
		ApplicationContext.supportedContentType.add(ContentType.PLAIN_TEXT);
		ApplicationContext.supportedContentType.add(ContentType.SQL);
		ApplicationContext.supportedContentType.add(ContentType.XML);
	}

	private static List<ContentType> supportedContentType = null;

	// TODO FIX ME 
	public static final List<ExitActionHandler> exitActionHandlers = Collections.synchronizedList(new ArrayList<ExitActionHandler>());
}
